{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5df7c7e1-2296-43d6-8a58-054267f1322a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy.spatial import distance_matrix\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e166dbf6-a77e-42e2-a2ba-988583e28cc7",
   "metadata": {},
   "source": [
    "#### 我们使用Wiki拉普拉斯矩阵的6节点图来说明使用随机游走作为位置编码的概念，先以最简单的无向无权重图为例子"
   ]
  },
  {
   "attachments": {
    "8c50e003-511d-4aaf-859a-1d099d30cd88.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQwAAAC9CAYAAABGbUP3AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAFe5SURBVHhe7Z0H2FTF1ccn8UuxF5qiUmzR2KNREARBmgXsCghIlao0QelFBGmCdAQEpNkBCzaUIiJFxSQqaExQLAhiQSzRxOx3f+d9/+tls+/u3bcD899nnnv33rlTzznTzpz51b9+/CnmPDw8PCLg19lXDw8Pj7TwAsPDwyMyvMDw8PCIDC8wPDw8IsMLDA8Pj8jwAsPDwyMyvMDw8PCIDC8wPDw8IsMLDA8Pj8jwAsPDwyMyvMDw8PCIDC8wPDw8IsMLDA8Pj8goEoERi8XM/fe//407PcN5eHgUTxTo9nYJgF//OvdySQLkV7/6lV09PDyKDgUiMGByeg377bdf9hPn/vOf/7hdu3a5f/zjH+7dTZvctu3b3K5vdrl//etf7re//a07+JCDXelSpd1JJ53kTjzxRHfIoYe63/zmN9lfO/fzzz+b0MiL8PHw8Mgb8l1gIBj+7//+z+6//vprt2njRvfiSy+6ZcuWuQ1vvGECAsD84V6DehIIGgTI6Wec4WrWqOlq1KzhTjv1NFeyVCl7Hw7fw8OjcJFvAgOGlwDY8fnn7uFHHnYLFy50L69cGRcOCAMhLCwECQ1AT4L/uHPOOcfVb9DAXXHFle6UU06x9+H4PDw8Cgd5Fhhhxv3pp5/cmDH3uIWPP+7++te/xoclEhaHHXaYO/fcc93xJxzvjjn6GHfwwQe7/fff37775pud7tNPP3X//Odm99prr7nPA6HDdzh6FQiQY4891l177XWuR8+eFhbwgsPDo/CQJ4ERZtaXgmFH7169TFDwnGED19KlSwdMfq275ppr3HHHHWeMfuCBB+bI5N99953buXOn27Jli3viiSfcgw8+6D7++GPzj2BBcJxwwgluwMBBFiZAGPm5DQ+PgkeuBYaEBXMSo0aOdHffPcyeCWeddZZr166da9q0qfvd736X/fQXwOT4Vzi4ZEzPZOfjQY9l7Nixbt26dXH/9Do6duzk+vXvb0JIzz08PAoOeephMKnZvl1bm6sQsx9//PGuS5curkOHDvYfSDCAKEwd9hv2P2/ePDdq1CjrxfAcYVKtenU3c+Ysd/TRR3uh4eFRwMhYYIgpt237zDW/qblbtuwlG37AvA0bNnRDhgyxoYd6EAgS/Ou7sDBIhkR/QGERD/McxDFlyhT7T0/j9NNPd/PmL7DlWH3v4eGR/8hIYIgZv/nmG9coEA7MW6ArgbAYOnSo69atmzExcw1cERZi/DATKxy9S/Sjd4lXhIN0M2bMmBHvxfz73/82obFo8ROubNmy8W88PDzyFxkJDFp6mLZZ0yZu0aJFtsLBs0mTJrmWLVsaoyI8EBYgkXH5D3jGd/hlFUXDGQkF3mt1JfwN4Bvu+ebJJ590zZo1s4lSvrugSpVgeLTIHXLIIf8Tt4eHR94ReWkBBoRJR40aacICocCEp4QFjAx4jt8wwyb+R1gQFr0Frl9+9aXbsWOHveMZYcgvV5zCkCBBQNSvX99WUX7/+9/bN6tfecX16nWHpQW/Hh4e+YuMehjLly9zV115pTErTMkw5Pbbb7chgZg8LBhAMkEBXgmYm0nMd955xyZPCY+eQalSpdwFF1xgS6ZMoIrxFYbC48o3xPvAAw+45s2bm7Ahjukz7rf5FA8Pj/xFJIEBcyIUql1Y1VYoQKNGjdzcuXONaWFgBEFYOCRCwoLhQ8+ePU1YoG+RE3r16mUCie+ABA1QPLzDITS6du3qxo0bZ++OPPJIt279eleyZKkc0+Ph4ZE50goMMfqIEcPdwAEDjAFZwlyxYoUrX758/D1IxpwwsNwPP/zgmjRp4hYvXmzvypUr584//3xTxEKZ67PPPnPvvvuue+ONN9z1119vw51kAgMQXvj67bffuosuuiiuONauXXt3z5gxdu+FhodH/iClwBCzffbZVlendm33/vvvmxLW6NGjXfv27XcbiiRDmKlhePQz7r33Xnt26aWXumHDhrkzzjjD/ofBcIUwGZoojFRxaGjy9NNPuxtuuMHmVg499FD38qpX4sMaLzQ8PPKOlJOeat0feeQR25bOhCPbz5kvYB4jcSUjEXrHFSGA7gT31atXd/PnzzdhwRIsgofwuML8VapUMWGhMHDJoLARRnxfOxBqNWvWtGcs/U4OeihA+fDw8MgbchQYMCMCgXkGNDnFdJ07d7blVDFqqtabd3zHe3oWP/74o4XJHAY9gO+//978yBGemB/BoTBwyUC4+o4r2+Lbtm1r6eP7pUtfcJ988onF6YWGh0fekbKHATa+8457dfVqY0pWMOjyw3zphAXAH0MFmPb111+3Z/QccDD0AQccYEMcGJ0VDjE2V1xOgiIMCQ38E+Yll1ziTj75ZEsf8yH0bDw8PPIHOQoMCQKM33CPY9cpTA7SMTPvYX6u69evd9u2bbPn2LNgsxjzDEuWLHFjxoxxI0aMcLNmzXJvvfWWMT5x8a3ixaWDBBjXBg0aWDjg5ZdXxgWch4dH3pCSi2ixly9fbvcwI7oREhTpGJl3+OWKrgXLqeBPf/qTW7Vqlatataq74oorTJ0cXY4WLVpY7+Cqq66y+RIYnKEJYSjOnKC41Cu5+uqr7Tn3a1591X315Zf238PDI29IKTCYOHz9tdeM8ZhzYMUhKviGlh1Ii7NEiRJu6dKlJhTefPNNd/jhh1uPgyEE99i9QIv04osvdn/7299sOEM4URAWXkzMHnXUUSZA6LVs277dnkcNy8PDIzlSCgxaeoYOMNq555xrQwkYUy4V+EZ+CAMwgcqKCwKEycl169Za72Pjxo3uhRdesB4G+PDDD12bNm3sO8IgrCjMrjgRNJUrV45/++GHH9j7dGn28PBIjaQCQ8z53rvv2tAARjvhpBNs9UHMKz+pIAaVX+00vemmm2yJtUKFivElVex2Pvroo+7CCy80P2vXrjXhQhiaz0gH/Cht9Fy4kv733nsv24eHh0dekFRgiDm3frbV7nHY4IT5YEI9SwXeJwoKllVLlizpbrnlFhMC2gbP0IF3TKh26tQpHvZDDz1kVwmBKFD6ypUvl/0kyMenW7PvPDw88oKUPYzvvv0uzqwY7OWqeYl0CAsVvgV8y3wFcwy8Q1jIH0KD96f+8VRTGQcYAuaZJjOjQP4OPeTQeNp3fbvLnnl4eOQNKQUGilWClLUyYVz5P+7444zpATtSJXz0Xvf0YA47/DCbYAU//vSjra6oZxMFhANkaBgXzoeHh0fukXJIglKVmI4hgxg7CvQd7g8n/cEdccQR9pz5ChzPFR4O8P+nf/9k7wFCBqWuTOKVYNFkLQ57GR57JlSHyZxH4SOlwDjo4IPsSuWwGzTM3FFAz4AhxZ///GdXpkwZe8bSKXY5eY4TuCeej7Z8ZJqh4KADDzKhJQGTCVgSVnoJx2PPAHSgRgWoDpM56AV/6AuFacmj4JBySMJZp7r/5NNP7D6T4YEEBkxfr149e8YyKkuo9B6Y9JSj0vHPWSSyk1H9ouoWF8QRFUrfRx9/ZP+5L12mtN17FF9Q/6IB5rZwgCHpl1984bZv32YNDVcU8TCVAF1o0pzvJDw8Cg4pt7dj8q527VpWCTKHx0qGBEY6RsafGB5bF2eeeaZNZGL/AiO+1apVy/aZhTlz5rhOt3SyQ5oZwmx4c4OtzhAGBJEOCCf5Y0ctRnp4tuDBh0yrVGnxKD5IrBMOsHr77bdsH9AHmz9wH3zwgZlw/OH7701IMJd24EEHuZIlStiyfMXjKro//OEPZgS6TJkjLQzCBL6u8x8pBQZnpFasWMEkN0MKtDM5ySwqA6vi5H/O3DmuWdNm9oxwLr/8chMi9DDYb0LvQkpe06dPd61atTKGV8WnI4CwX1ZjUDxD2K1b/5ptpU8kTo+iQSJDMz/GjuhnljxtBpCwuwLNyV8qEAZChCMmzgho6fLL61vjIPg6z1+kFBhUWvVqF7oNGzbY/9WrV7vzzjsv3pJHqQgqDMc3dB+nTZvmevXu5b7Y8UW2j92Bivjw4cNN05P4FU+6uMLE9c9//tOdeuqpJohQZ39p2bJAQGXNoXgULUQ7gKHnQ0GvdcqUyVZnsodCXaO7Q52Ghxw8Fy395+dg+PGfLL/UM8Avk+QVKlRwbdu2c81uusmECQjH65F7pDXR16d3bztgmcK+o9cd7s7Bd1rhg0wqQBVN5b//j/fd7Fmzzczfrl27rNJZbq1Ro4Zr3qK5K1+ufHw8m05QhKFvJkyY4Lp3724Cp0nTpm7y5KxDjzyKFtSP5q44/nLQwAE25OAZdUUdYUKBQ7fZpMjB3ejs8J9lcpifJXJoZstHW9y7m951a9assf1ChIMAIhyEDVeGKXcOGeLq1s2aP/NCI+/IUWDA4DArhxVdesklVqmMFzdt3LRboadjaLX8+OMeF/5e8YRBxfJM34BU8ciPBBK2PekNQTRTpkx1NzVv7omliKHy//vf/+769e1jmwxVp1yx7Vq3bl132WWXmaDIFDQ+zz77rHvmmWds46JogmuLli3dwIEDbY7D00HekFZgMENdt26d+O5R9nswRlRrIX+poMoD+OU/33NVyw9z844w5UdIFb7iVwuFwRzmRmhtaJmeefY5G5Z4Qil6PPPMEteta1fbXEhdUCd//OMfzQIbGw/ZNgBEG9SrXCJ4L0dYqluW7ZkLGzlypE2g8i3xnHbaaW7cuPGucrad2GRheqRHjhykgj6iRAl39TXXWIXwDAPAPJfjGRWQCviRk1+YW8IChP+rQuVygvyRDu65Tp061XRGEDw1ata0c141VPEofKi+586Z4xo3amRMTD0z1zBgwAC3cuVKO+EfYRFeXsePaC6Z45388Z8Gg++POeYYO0Lz1Vdftav8vP322+6qq650S5Y8bf6JxyNzROKia6+9zo4WoJA5AoDxJ+NEMSoVEBWq8PB9smdRgD/ix5EexrMcn0g60f1o2aJlRuF55C/UoNwXCPE2bVrbagj/2SuEhff+/fvbJDfMjl+ECIJeSFd34XcIBWiAuic8zqYZP368W7Bggd0jOFDmQ2ixIkM8xOmRGVIKDAqZCmDJCqFBBbHsOWjQIPdFMFThvYSGWpLCguLEkS5aF1osiIJ0Yabv/EqVLH389yhcUC+UOzuOe/bsYffUE3ZKsOLGPBO0Rf3AvLxXfer7qI5wuQLCkjDAYSXu2WefsVUz/LES067tzXaKH3HixyM60nIShU9l9OjRw1oGChhtzbvuuivOiImVVtAIx0d6SAe2QV988cV4mtAZef755+L/i5owSKvSm8wVVtkVBlQ/mEe8pVNHa/FBrVq1bLKT3irPqJtEGsqNA7pXORIu/4nnj3881Xo0rLzwjCFr0yZNjY7xR/l7REPaZdUwHn74YTu5na4jhTx79mzXuHFjk9oaS6riCwoKnyvEQDcUs39oovJfxAnQSr311s7utkDYHXTQQZZmvi3I9IUhYUB8CN50wC+trhipsNKZ36BumCyvU6e2MSV5P/vsswMB/rxZbaOOoBf5VT51z7KpVL9zAu8oK+qVJVe+1XMQDhf6hE6YP2ElRophNWrUdI88+qjRiQSXR2pEFhgQM4V6yy2d3LT77jMioNKZka5Tp06hCw0JCzQDOUUN1XPSyJIca/VMciktZ511lrvnnjHugipV7HvlpaAgpg+XAUO5L7/80lo3hk+UF2XIXAv6BajCQ/xhJAtnT0H79u3crJkzLY/oVjC/RA+VPEl4JtKJ3rVr184O2NachuoxDJ4jWJgH4Rxe6hSE6zUcvoQUx11w2BUCiTroF3zfp09f8+ORHpEFhiqM5cr69S93r61fb5VGi8E4lUqgwqkgVVoiQeQWCoerHHGjgcoZrCjtQDAVK1Z0y4Lx8U8//dv16d0rbrEL0Iq0b9/BdenaJSDgLPX2/EhbKjBBvCFwKBZt2fKh++ijj0xoQKxMAELApAv7H0cffYw7ttyxNtY+84wzbflPrTAojPTmFUoj8wP1L7/c6gShzlI8+hUSgEJifsTU9FqZrIyCLl06B8PRsRY3SAxTzwH3xM9KGkd9AnonHKkpk47FvYyLGhkNSVSgrHVfeUUDa8WpYAodG50ccgSo+MSWIbcVoTi5QoCEC5ivaNasmW1mgxDZ67L4iSd3O6sVm6C9e91hjCqw7t+rdx933XXX2X/CJPy8pA/o+y927HBz5821MfPf3/u77a4kfVEhIYzwq1nzYtNURdtRUHkUR6iO6tWra4df8Z9NgDCo6i4sMBKhHgbLrHPnznVly5a1Yyi40isL55t7wqS+Ge5wD3IKn7TIASZDn3rqKft/5ZVXuvkLHrQwUqXPI0OBAVSojE0bNbzBNPeoZAoeBRy6h3StqXye8Y7K5T4TQpd/rmI4hBNde5bL6IryHFeyZClrkapUrWr+cap4lIR63XG7LbfSBQW0ejc0bOgGDRpsE3BAxJoJwgTG1uvp06a5+++/PxBiWccaKEwcRnzk+IY0IFjxAzOQL7Zyk3aek3e+QxjXb9DAde3azXof4XCLE5QmJjWb39TM8sSeDjQvWWXjPfWnek0GhYGRaIYkCHcaBpZF04FwQToaUy8GI9P0er7++mvr4T366GM2ZC2OZVuckLE4hdipHCpz4aLFNvNMJYC7777b7F5QyRQ6FQNT6T3fRXWAyhOh4RgHc0gRBx/xnHBRzFq0eLEJC+KCYMTEhFO+fHlrPaZOvc/SDPgORaKqVS5ws2fNsuEB6SXMqJCwYL6EOZ3KlSq5YcOGmrBQOGy7RoOR5d7HHn/MiJRNVps3bzZL5twj0BhaPfX0U+6ee+6x/FGmhE04LBPPnzcvCP98179fP7d169aM01oYIE2U40MPLjBhQX2hEUzvSPM11Ec6hgaqf8oYIUpeCZNrosMPINxUYStM0kH9o4rO3BfljNBYEKQbREnfPg16GLlxP/zrR7t+9PHHsRubNKE2YkHhx4IKsWuT4Nlzzz0X1NPuCCo47oIK383peSJWrVoVa9OmTSxobS1sHPEFLURs46Z3d0tPMqd3/9z8QaxLl66WRr6Xq1fvktjKlS//j/+cnN6//saGWJ06dePhkK6A4GIBIcaCbngsEAjZOdgdiXlOxI4dO2Lz5s2LNW3W1MJTuMRx5plnxp56+un/SVNRuu9/+Jdd161/LRa01pZersFQMJ5PkCyvYQSMbNdgSGJ5Pfnkk2P/+Mc/7JneiUZUdokuFfQ+EGB2ha4OPvhgiytoeGLvvvf33fLj3f+6XAsMnAqW66RJk2OlS5eJMzNMCdFUq1YtNnLkyNj7779vlRQVW7ZsiU2cODFWu3btINzSsaDFijPlIYccEhs6bFjsq6937paOVO6773+I3y9d+mKs8gUXWHhixJKlSsX69Okb+3rnN3F/yQSHnj38yKOxYGxt6QmGF3atVKlS7OmAmXft2pWdi1gsaBnNQfBhARG+4ngPIQettD0HPF+zdk3suuuus3T+9re/tXgg8uEjRvxP2orajRw1ysqS8rjqqqssD2HGTgcJhWbNmlk4QY/Q6ABI6ISBf4UbNQ7507fUGemlfGc/MMfy4QVGzi7jOYxEBHUQ78Yxjh80aKBN+H391VfW9aNrynuWDpmY5OR2xuIssbGlnfkOuvV0vZlM3bRpk20gY6KS1QRAl5ZwWFHgGMXBdw6xcTEIKj0+BEkH/JIWXNZcyDg3JhgGsHIhYNBnWDC0YsIRKA9AcTGM6dixg+Wd/6Srb9++dt4Ky6SALjTdX94TH36ByiqM8DvucQGDxMuOe5avmQDE3inp4BnzGoPvvNPmQ4oa5Pf6665zzz33rOWZIVj9y+vbu6j1Q54os/CkZ9Bg2CoYk9vQCtbasAIX9AptbiNcp1FB+aoux44da0Nc6vnmtm2D//dmFNa+hjwLDIFKUEHD9BMmjHcrV6wwJRkqB0AM+BGDgPB3QPdUIKBS2XUatASuZatWrnr1i+w5SPw2KkQsgPmDwYMG2U7KMIKhi+varattiYaQiYdvmNjs1Kmj3fOMeRFWiBCEIOwXZJrGsH/ulVaeoXjEEZMoQAHeQeSjR98TFy5FBVaHTjvtVJsPYGKXeRqsqglR0iaBweqXzCvmBCarmTMLhr72nco7ahkQNn5Z6UNPhzBoyF58aZmtUnkkR74JDCFM8BDNiuXL3SurX3Hr1q41O43hCk2sXL7VlWVFJqYqV77AXVitWnzCMhx+XqGwuD4we7YbOvSu3bZeM/nIEixapOCxxx5zrVq2MOLiPfshaAlp6RBwyQRiTnnkeSJD8CzxewG/hE88HTt2NBOGCAla9l69ersBAwfG81MUWL9unatW7UKLH0NIrErRqyTdYuZ0UG+Ow7pZbeGEf+odpTbyxoQvNi+2Zx+uDSZPnmyKXipLlWEqhMuXniYTs/SO+e6djZtsorwoy7I4I98FBqCwYSp15QFd6W3btpkQeffdTe7z7Z+7b3Z9477/7jtrkQ459FBXskRJd9If/uCOC4RFmYAJaUVgEkB4VGBU4ouKMEHTgt911xAbcggMNzp37hIIrQvdDddfb8MnwNAIVXmW5BKFRSpC0/tMGAmoTBU2wxMsizEc4fl9901zjW+8sdAJXfEhcNHuJF+33nqr7e3heSbpUZnQg2K4CiPrPBtAPqGfcePG2dI6ftEGfe211+INSqZxMdxF+Q8Bx7Pnn3/BGiiP5CgQgSFQAbiw4EhEOoKCGanYTJgrN4AYJZxo3W7v2cN6GwKESWtOOpjn4KiEEiVKxFtFkC4veq8r6uzs+tUzelUIqMRwwv9JJ2ngP/oK9HAA4/sXlr5oaSsKDOjf340aNdLqG4bmjNxwWnML8k6YIBwWvaxJkybZPeUwKxDymcRHuAL6Qyxp892ECRPNQldxAmmV03/lkatcYaBAuZDKCzMTFa9MC4kZTfTH94RT0EBYKE40/15atjxuRJb4JSwYl6NBirCAQDMVFnyDY6IVHQ0sQTF25kpLCXgfBt/xPS6cTjQoOSSK9+yr6NHjNhNghQmlhaMAlH/2juh5JtA3XCmDsKDA8ZweAcA4juYaXnrpJaufVOWfCkcddVT2XVY+igPIK/nHkS/yT93joDnd85z38pubcs8EBc+J2VCm01VqVH8FAcVJwTMcopvfqVPWSfNUDmBWHZN/ELSIGBclX/JLhTOcYAs+4TKsECHIbyL0THGRJoZyaJYixEjLyytXupnBf8D7wsS32cacAdqpym9uQX5wQOHyn3IiXCbCEZYAYcFwV/URFfJLegH/OROnqBBOO3lWGbC9gDlA7HrQWC2YP9/m01iRopHhYCf5VVmBTMoiKgpNYOxJoOBpqSnwjz7aEhcW7D/B8U4VwzVcSclAODiYGKGAxic2J7nHpBzhJfYqkkFxKT5aW8buzBkAwps4cYKtWOCnIAgmDOUJF+7ZqLwyjV/5CucxfFV43CNk6f0JLMHzPpM48UtYSi8obEELVPfKK9rCbJxs2/ZmV+n881z1atXcNdde425q1sy1vbmNzRXd3Ka1/b/mmqtd1apVTGu5a5cuNhejkwMVXhTaigovMJKAAob52HWJTglEhM1J9smoEhKleSrgT4TMrPwdd9xh29wZO2OBKhMiB/hXi0Labr75Znf2n7I2YLG358GHHrQ484v4iY+wKBcEA4KKe+KA2UhHiRIl4/nQxHDU8gH6lnh0z1X3QOWIH/R2WNnQcxkQziROhUdd6P+BB2X1NgoDyitliMBbtuwl16L5Te70YHjaskVz2xJAL5SJ3s+3bzdBQNlq3xFL2Ns++8wO7GLb/vTp01zDG653pwVD3FtvvcUMGNH7IvxwueYFXmAkAYRDAbMtG2KiNWPfAROKMAwVQOGnqwD5kT++Y3YfE3UoIHXu3Dk+DMkEYgoYFcZlJaHJjb8YNqLbypyG0pkJlF7CEZERH3ERHunVEArCRcHuL3/5i3Wb8YeDkPVdVITzBIhbUJqULvxgxZ54AcJKS6+Zxqn0CgcffHD2XcFC+SB+bOQ2bXKju6RePetZkB4JZ8qbPUnVq1e35eZGjRrZJG/Dhg1trw5LzwyRCUc91R07Prf9TRddVN0Ez9KlL8TjoozyggJdJdkTIaJDqtetU9sYghUINtQxZqZCxIj4iwJVPEpiVDDEgrUylvOkcwDQcEUBTHGkguIXY9HyMHlKq8u3bMjDohRhiQnDxKJnUbBt22d2zunmDz4wux4skdPiffHFl+7LL7+wCVxWe0SwvXv3dkOGDInHF6WcxECsTDF/lEqQsvzNTlPsjIARI4a7227rYWGkKzdB8XFFsxRGJb2PPPqYhV0YwPjT0LuGuMVBXRE3eeaKQ/cHGzPY6WDXLxOz0GEiEC7op0Cv7CBHT4VJYNUv+aMhadS4cVAvfUzDmvCj0u7/AIHh3S9Oe0UemDPX9hcErantNwABM2S0ZwEETGTfsUfk4osvhoNigaCwfSM8v/baa+0ZLhAY8W+iQGmR/1tvvdXSS1gBA6XdRIdj38Q3u76N7fjiy9hf/vq32OMLF8ZGjR4da9eufZDeWrGAYGPly5e3vTYHHHBAPK3JXECkdr3mmmts/wwgj1GgPTR9+vSJBS2q7T8KBGwsEEaxoJdnjs1sEyZMsI1iipP0BcLKykH1EwUqu6CXFDvrrLPiaf/r396ycolSdpm6cJjsvaJMAwFnLhAWtvdqwIABsY0bN8aCBiA7pb+A/EE3lK3oJxHBUM3KrVOnTrH9998/vk+GOALBEwsEYjwtucmjFxhJHAXZtl27+Iave++9N06QmQD/VC7fjsremBW0nrGgFc32EbONZSL+TAWGQDy4tWvXGmGQ7j/96U8mCMjL9s93xDZ/8GHsrbffia1Zu852u44bN9527jZo0CB22mmnxYLWy4iW78U8qRzCo1Sp0rGKFSvGzjjjjFjQ+7KyIu6gNTRGF1NGAYwLWrVqFY+D9ED0ZcqUiZUoUSL2u9/9brc0nHTSSbFg7G7fUWZR4wrXJUKI/CrdlFNuGCmq2/nNLhPGpJ+yhqHJW/fu3W2XchgIBZwaHZVn2PGc9/IXBhv3mjdvvlvdEu+AgQNznUc/JEkCxv8XVa8WtypN15GuoRAQV/ZdcgR1ZdegQq2LTNeZTVQoak2fMd21atkqPkxh1YW5EpDJkERQXICJMMazbNTiexSQmGf4+KOPbVhB/OGNdlFANxi9iqPKlnXHHnNM0DUu68oeHbiyR7ujg2dHBl1lurnEd2HVKrbMR5m9+upqd+65f453f9OVmcqDocGMGTNsj4cmNROBzgoWyLFkzwY1yos408URBnWDf+JjSEL82CLBdkr4fSZhpgMTtR3at7P6prwoG4aoQ4cOdVVC9maB4uWqMkwG1b/8gcQyx7IYmyN1hCTulltudUOHDbP5qEzgBUYSMCY88YQsXQvG0wgOGIeChjBTIVxpujI5xWrLZZdd6oIuv/u//bLGqhAN8xhMUoLcCAwAkZEuiJ7NWDBBmICigDFyhYoVXYXy5V358hVs3FyqdGlX4ogj7PS7UiVLusNDatqJIM3S9oQImaUfNWp0PC+kJSeiTwTzMaz2MJ/BpLMmAVHUQnghvNnvAZR3ECUOlQnfkS7mkJhD4DvqukGDK1zzFi3sIGdB30RNfzJgXOimZk1tvgrBSH7Y3Tx48GDbXhD0EOy56i18jQqlE/AdeSQe6oN5p9tuu822MxAPqycdOnR094wZk/1FNHiBkQQsR9WocZEVOqsjtAhsW8+kAsUobI5CK5FlP/ZIYH+Sd4QDoeeHwAgT9OA7B7uBAwZa2ISBg0C4onZ+zLHHWk+hYsXjrDfCas3Rwf8DDzzA7b//AeYH/8lAPAglQFxyPCd8lqE5uJu4afmxKgaxyl8qqGyj5h0Gwx9xhfMfBcQBMKfARHYwFLD/CqdEUFfn/fk8d0sg9KpUqRo3WaDvoqRPUL7atWtrVtRRtoNZOdeH5XWg3hWQ/3CeuIf5ucoBvlH+E/OuZ1wJn3qgzBAaKA2SJ5Zy+/bt5/r267eb4E0JjU28+2VS6v77Z9p4D8dEIggK1Fw64CeoILvHaBDGf4JijvXv39+eM5nFBB+O+Q0mCHmPW7FihT0LKjI+xs4kTq5z5861MXlATLEqVavaJCbzFh9//Mn/5DeVw+DQt999b1cmRqOMebdu/SxWqXLl+NwPVscA42vSlioveseVvJMfvqM8uNd/nPIq/1GBXxxhAiYYSStlf/jhh9uko+pCDkNL0IOsceFUJuG8J3PyM+SuuyysQFhYfMxnAeULKG1ygHfQifxkCoUDwmXWtWtXo5FAiFi6ZDgoSh1HX1vbByAp/fXOrHX5oGytZ8A1KvCLYx4Eac5WbHopHC9Jy4R2IstcOKQ+LY7AOaN6JmmvNKWC4gSkl2/4z7Di0ksvM3sPJYOufDLoW30vkFb1TEhLunQExGhDFvbh4J/W+L777rNxOyB8pSsZFD5XvscRv1pRnNLEvZAuXYLiJ12EwfwIG/d4Rq9q8OA73YIHHzQ9B3oYAtbPW7Zs4erVreMGDRzo1q5ZEy8TkFN+AH5eWbXKjRg+3OKkZ4GyXvfu3ePpISzAfdjxnnfQCVd6QyyXshUA+yvsI9q8+Z/2baoy1TvC4B7HRjuOcqAs8NMjoFPs1nCfDn5IEgKFSaGxrj9wwAB7NmLECNtKrnfpCjWQ5EYcnB6OoEBwsK6PbQ8IBiIiDIUH0dJ1B61atTImp3JRzGH3KowYZpBkICz88V3QS7H1e8KuU6euzZmAdOnOL3DiGXYxsJJFeoYNG+aCFm23MXpRIVxOvXr3ciNHjLRnDBMxnCPhjUIYp7zPmD7dGDUMzrRBFbtho8Y2NxVGYl1R30yeo39DvqED6dwA/BI/ULnoP1i+YrmbN3eepYE5CMpUWqlg/vz5JuBgfPKUE8JxKI3QJRPx69evt3dYMINW8JuyjhK7HPuyU5ds8J13WpcNR/cxKOT4slY60N3F39KlS+PLWLlxS5YsiYeXDsRHVx0sW7bM0k3cGElOzGNBOnXBR4wcaV1v0nHkkUfGNm3aZGlTtzhKOeYnFKe69mvWrLElWrrkpHHe/AWW7l3ffrdbt/yTTz6N3XffNFuiTtRB4X8gaEyf4rNt2+PfKByu2J2lHKgLltM3b94cT0dO5QCd4UD79lnLr2FHmgkP9/DDj5g/+U8HxSlaWb16tdnHFb1EsWmauunaR8GKiKTsd99/l1riJgC/OGa+ObaRJUAcs+6JDlVzDMUITEIyfGAiTlu3o8Qd1H32XdZeFcB3haXmLASEZ2lh9v3cIA/cMyTr0qWLtWykiWe6FgbC8e336/2yljY7dLAeDw6NSg414j3DQfySVv4zNMHEwepX17iHH3nEll21FZ6VHHoOHTq0d2cF9Th8+N2270PhsLIzaeJEa/kpF46aoPdIb4D/xIPLCYTDUIlvWHplchyjRKSVMLJ9ZV+jQXGSJvLOPibsitDzA5jVJF+p0uV7GEmcJj2RvJ07d45LZlw6yA89A5SX0EJM5lDSCYgqFhBsvPWgVxF0Fe2dehZR41SrxfEEajFubts2af4Kw7286hVrvVSOgdCwtNIaKk9co+QvNwiHrTgpo6ALbxPCpOmYY46JvbNxU9L05+QC4RG7/fY7TBtV9SbHMRjBUDK2+IknYt273xbvwVSpUiW2c+dOi1+9nJzyHU73xk0bY2+//bbdC8EQz+IiDw8//LA9i9rDAAqbdPDd1q1bTQOUemKietbsByyfYSv7Yed7GCEE5WhXDkcKCtYkLfoAjEW51/tUkHSmlWESk01RyRwGeOiFhLdo45/eDe/5HqSU9iEEhBlPr0A+igKUE72k/kGrSmtIXu69915TUCKdvOc56Y1arpmA8BR2wBjxsul+W/e4jgq4e/iIeF2nA35IM3ZeBw0e7J586mk3ZcpU60UKKM49+OCDrnGjRsG7yeaf1rtly5bWkyQM5V9pSITSDU7+w8lmvoBw0OMgL1xBbsuMsPmWXgbpwR4tRpdJF3S+8PHHbLmV98ngBUYIqqjyQTeQewoULc0f//VjykoOQxXJle9zchABV0Bl4fQMwgiHkw5KG9+hZCaiYJdjUUBlh/Ghtu3aGZEjGPv162eKSuQVgqRbrLRHyWcUhMODAWBYyoWdwePHjTf9A+JlI9a1115rZU560kFpVv2g3YqC13PPv+CWLn3RJkAR+ADBQdcevwgkJia553vShssJpFtlQdpw+P+/3/yyYgRShZEOKh/CIl0MSxj+8BxdIU7kA0pHGF5gJAGtPJKdAmN2+qOPsw5zDldmTlBFcqVC0jnmHKg0OZ7xbTicVCA9+OFKWC+//LLdQ1ynnJJlGLcoQD4A2p6s+MBA9DRYXubkdFTU+Q/zkm/lQS4qwt/gCIfwYDSWJNltfOONN5qyEgxL68kcC8pKIKeWNCeQL8qWOIgPa11VL7zQPfTwI2bWsX37DraETTpwmGFEWKpu+SYV9B0gbXEhE/zyG4oLi21169aNl8+KFcvj7xPhBUYSIDCqVs0ymU8lY/AXiCDTVXoUKAzUnFnWwzFEAckqKhUU1saN79gkI/851Rw16qIGQmHCxElm0ZyeBnlDP6NBgwamVwBTU8ZiwDD4n/hM0LtwWfFfjAlTL1y4MK6pyzuE0623dnajRo/OMdyoIA7FrXipy9H33GOT1/wnDTfccIO9l7DItG4LCqSD9MghVJXO5cuW2X0yeIGRACqawtRJ8ID17jBx5EelKwzUg9lngjv55JPtGZUWBUqLruh0iDCxhUE3szgAAcx4n+Ma1MXGTCFDAqyLsymOdON4Rx3Q7edKXnSVCz/X8I3vFAZ6LYzLUU7iUC2945S4ESNH2n9cfkHhkQ7ifnPDBovviBJH2EqY3udnnPkBpRmwaofwpkxfWb3ahlXJ4AVGAlSpTNqhOAWBQwRr1q4xIggTb16geFg+ZakOR4WBqISFP9ID6EouWvSLIZaLa1282/uiBGkib8NHjHAzZtzvSpbMsirO0iO9DQQlWrHMvzB0oWtMHrhKCOBfZa9n8sc9y6VvvPGGa926tTvnnHNsclPDPTaqPfb4465nz9vt+4IAZY379NNPrCdFmiqdV8mUwYizoOLNC5RmHPMvLOlzj1FhjBQlgxcYCaDAqFzWvy+uVcvuIeIpk6fE34X95Rb6FoKW07N04fJeDoEG40ybNs0sZ/O/UuXKQeWfbe9JZ1EjnIYbmzRxzz3/vOkTwFT0EGjNsMaOvgqTh+gbPPfcc8EQa6PNdfzn56yVDgkQhhYMvRAw9Mw4MpExOCsWWDJDeOKH+QWO10SLE01GQFoKskzo0ZBGcOppp8brsjjUQyJEH1zpBSK4uSf9nFIoP2F4gZEEMC9AWYZ5BZhwyZIl1oLRooW7wbmFvqVy5PQsXbi8x5FOvmO3JXsMSBdMxX4Oei68TxdWYYNygzAfmDPXLXjwIZvLCA8/MIXIXgvmHnAIEIQLw4vmzZvbigMKVDyvV6+eu/zyy804M0McQF3hsDOCshUHE9F7SyT8ggK2RwDxHXd81rJ2YcWdKaAN0oaDrumJibawli8/YXiBkQQwHUTHxOeFF15oz7766is3atQoI26YVAVdFFDcMJl6FzL2w4Rb06bNzB/vihtEpKQdYYHgeP6FF6wngN0N3kO8gL0Tq1atck8sfsItWLDAeg/oOWAQZs2aNbYCgl+GO3yHTgGTmitWrHQzZ812F19cy+qR+BIJv6Cw69usc02I8/DDDo/nt7hC6cPROOo/e02SwQuMHKBW//Y7etnkIfeMizHhDyNC8KCwiUHxET8rEKgjc8YJjIEwY2KRii/sdGUCiJLyJL3oRVSrVt1NnDjJvf3W27Y82apVa5sspMUrXaaM9ZboMlMPqLsz3sa4D8uV5JtymDZtuvtb8D3zJOdXqhQX+lwLS1gAbQ4jTh2QVJjx5wbQktIL3XD/3bdZk56ic8ELjBygSmZczNq6tD3ZF8E4lZZNBU0hFzSDKg7FByMwVkengfMqeAbj6VxQpb84gzIk3SJKtsezt2Psvfe6V9esda+9/oZ78smn3PygdzHj/plu6n3T3P0zZ7l58+fb8+rVL7LvACsSCJVweEXRw1KeAAJrT4BoCgEuqOwS6cgLjAjoefvt7rzzzzcC2Pn1TluyQ6GLQqWQKVQVekGAcBUHaaB15hkHGLE9med05zG3xv2eBNJLfgTyBcPj6E3Q06hZ82Kbs2BeIsv8/sU2o4+aNv6ZlF4ZDEOAyqeocNCBWRsXSZd6G9xHBX7lX/eJLtU7nN5HhWiGyWfdH3Rw1pEGifTkBUYaUPAQ7pgxY233IoTMLkWW75jXoEVhRh5/IpT8RDhchJMkPzY60A+hOw6T3D3sbjuXRK3rngryCsOL6SU8yKMcy5Y8O/mUU+KmE5nDAUUpLAD7gFRn6JfoPirwK/+6V3kkvtOz8Lvw+ygIp4/DqPiPO+LwLPut3IfhBUYaUJgQKWv799wzJl55aH+ieIRxE5iWIQtEjH8Vel5BGAoPYYFwQrcAZadx48YZs/D/jjt6uaZBr4f4SdveBJU3glJO2qFoszLRSRkxq09d8JxyKCpgI5X04N59L2tpMpM6CdMOV4SjHDQALeodDRXP9F4Nl96nA36UVr7fvPmD+HcnnHiCXXkXhre4FREq3OnTpplFbIEuM8yLzQIgoYELV1piwSdDYiXzDeHxHEbhDE2WHDlwl/8QSMeOnUwdeV8DZQLz1Kp1sZnNY8IOE3u1a9ex55RPYUL0sX7dOnfhhVVNuNPIsJoDogpzCTv8IgDpSdIg8ZwwsQbGhkjiwp6FlAtxGF5mr054Z2w6yB9HUxAeG8/4/97f3zcr6onwAiMDqHDnPPCA69z5Vpt05D9DFir29ttvj2trquIlKLiKqBKh51z1H/BM/lH7vvPOO01oEDZ+unbt5obcdZelIVm4ezPU45I1bsAKCatEeleYUB3C5JUrVbLzTVnVYWkYUwZCunoiHOoXgcd5ODRIUcHqERPybCaLIjQVF/TDOTCK68QTT7QJZwRVIvbr26/fwOx7jzSgsqmIs84+2512+unu5ZdX2sQWwxFsaaJ1WKp0KXfiCSdaZeEfBwFLgEgYcA073qvywgKAg4GwEDV69GhTpcYvQumuoUNdn75990lhIZDvHZ/vsOEhZccSLJOihd27AKoD6ua19etsOwF1xaZCzS1RV1FBeAwTEABowGKqAIW3k046yRiaK//Z8Iajp8ERFeyOZaiqMFKB9OEHh34L5cizq6+5xhTiksH3MHIBSW9a+65dugQF/bw9h1gYJtAVxfAthn+xm5Bpa8cKDF1PFLKeeOIJ+x6hBMGx7X7kqFG2uUwVvi8Da9dVLqhsS8uUzdNLnolrdhZ22UgojB07xvW64w5rodFWZdcsjYYEWap0JaY7aj4yzS/+gb5h7xQ6PaQTXRhWpZKF6QVGHkGhYl1p4oQJJkD4D2FAPJj8R+LTytAqMMZkkm7//X8ftAJZB9owafnFF1+Y2XuIn+Psli5dapazID7CASgvodDEHAb6CpkSyN6Ms848w1piyn35ipVG/Jm26PkBxckq2mWXXmKraNT3ypUrbTJUDU1R153iV3pRq69WrZo1djRwlGFOQtcLjHwCwmLx4kVu6pQpttOPioBAAPc4KoFlNzQUsyw/ITB+tNYRgcGciCChQ6+lRYuWtmkLRgBeWOyOjh07uPtnzLByYe9I6zZtst8UPqgz6v3Gxo1MhZ16p7fJcRUwJL1F6i6nOuQ5kJ/cIEr4gN4EvSD26pBW0seZq3cPH27fJvveC4x8QHiSjUOPX3j+BTf7gdluwxtvWC+CSqIy0kETpoSFaTeMztSv38B6JwBChACTVeS+DM4Lbda0iZULBmvYR1JUZaReBOe1tmh+k/Ugjz32WJsfYJ8PtMD7ooZolr06zPtgHoCe6+OPPW6q9cpHIrzAyCfQsgAYWqCngfWiVa+ssuUq7AyglYjw+DcVth92GvezVZatnKweDE2oJOYoUEcPI6cK9MjapHb6aadaucKcf/nr34qF8aCaNWvYki9CgkOqsP0Bo0roF4VQIy1y0BTCAstn/EeTdtbsB+JDlWTwAiOfQcHnRAjsAGQrOiq4DD8YluCOOeYYN/Suu9zo0aOsonr16u369e+/WxfWI2dQrhxliPkByn/tuvUZLUcWFFa9/LKrV6+uMSDpevzxx830gHqKQmHUL/HriqPxQX+I4RJAd4O5C9nEyClNhTsrtA8gsaA1psXRk2D5i2Uy5iPQVGS5DKUjlmkZkuD/zTc32LdUqhcW6cGms0qVKts95cVyNxCTFBUwDtyqdWurUwR/h44drKdJvUIPpBVX0OmUAFBcxI9C2cCBWaf8k76u3bqZsAD4ywleYBQwqBAqCEdlUTlhRxcVYFMRhRsqi6HM1q1b7duiJvriDsqQMmNzoMpq5YoVdi1qkJ4+ffrYRjnqefu27WZBnV4mAkTzWqkYNK8gDQqf+KBDVuCuv+F665mRLrRju3TpamWZDl5gFCKoOIRA2EE4VCrS/aiyZc3fhx9+aBbAQZRK9MjawyE7ICxNo/RUkIwYBaSldOkydtQCGxep79dff901adIkfswCDIs/ufwE4VEGXBEWxEdjxB6orZ9uNdpiqX/M2LE2NI5SXl5gFANQcQgOhidULjPWsqnokRoiclYg/njqqfafZerXX3vNnuc3E2YCBAQCgaFJ0yZN43NSrJigGAXz8j/cKJDevKRZ3ysMwsYhLFDMQpEMNXDeH3b44W7evPkmbPHjBcYeAlXU+eedbxXLf1pJKpUupEfOoKwgdhTbUMGmzBAYa9dl2fgMM2Nhg3kKBALq/QsXPm4ChGV28Oqrr7o6deqYsWPqWPkQo4PwfRTgX7REWDjiJPx58+aZujcNEf5YRZo+fbqrfMEF9h9/UeAFRjGAKuuCKlXiZulpIdnA5JEeEgqnn3a6lSWM+kbQ9S9KUIcwKpvROrRvZ0u/pJOhCS07YAL0qquusrNp0ArFP+mnV4ITCAuXDHqn9/qWsHAoBGK7hfNdsbROGjC29OBDDwW9jcvsv4RMFHiBUYxAC6nTyjAI8/HHn9i9GMIjOSRwscBVqlTWxDHM+MWOHcY0OTFbQYI0MKnYKmBUdp3ynyMUlyx5xgwaY68UwcYwBZusVYLGYubMmWZ0h16m5rZ4T/1zr6sc/3GEIwHDd3yPgGLZFBOTs2bNivthAvaJJ540A8mEEbVnIXiBUcxAFxHiglDeCoYlINNK3deg8mFpukyZ0nbPvhzONQGFKXBhQoCCXvt2be2cUtLH0jlHQaAfgi1SNsmhkg0Tkz6GCih3MWxguZMzcqEDmF89DxzP5PjPOwkJhjsMcTCzwBEM2J/VWTW4tm3bmS1UBCtxEkam8IpbxQzY2mjTprVVZrObbnJTp96X/cYjFWAAGKjJjY3tLFUwadJkO74ApoSpChoIC+qNtNxySyc3Y/p0Y2TiJy0YaIZxxew8ZzfywAH9bakT5ucZV/YcMRnJtgB2PbOdnRUNdHmYf8Cq9ze7vnFbPtri3t30rlu3bp3tZ0LwoBhIPOSZ8FhyRghhCxWorHIDLzCKGbCjwO5LKpWZ/zc2vGlLXh6pISaYMGG8uyNoYWGYdu3a25JhYUECo0/v3qa1yyZDNHrvHDLE9ejRczfBFWZahi6PP/aYu/fesTaUwh8OaH8RggfHNzi+x9GrwC9x0ysFxMFcGAKnW/fbTP2btAClMbfwAqOYASM5tS6uaUtfYMObf4lr4HmkB+rhlB+MyiaqhQsXmSWqvDJKOkgA3HXXEHfn4MHG3DAw9lYHDhqU7Wt3kCagdCHk6HEsXrTQ6n/z5s02tCHsdCBu9FDQJD7zrLNsuFOrVu3st3nrVYThBUYxAxWLzVC6s2DcuPGuzc03FzjB7y2gxT0p6MZ/9tlWmzdY/eoa029Jh0TmzQ3oVdC70FBA9laj1F2iHyx4Y1cDOx9bPtzitmz50H29c6f7NuiNIIjoQRwQ5K9EMHQpX76CK1e+nBkQOvPMs0xACvlNN15gFCOoFdA8BmAH4Zy587zASANaZ8qOMmrcqKFt9AKPPva4TSSyzRxm+/m/P7uDDsqaB8ipPMNhpYPqbOLECa7HbbfZEIK4mH+aPHlK5HAEwsMlzrkQJr0mbKj8/DPv9wt6Mb+1fGjYIiCsiBeX3/ACoxgBQmXCa93ate7SSy+xySsmvRiW8Nzjf0GZwZBiDoZ0w+++240Zc489l+VruvYIXQneXwfleXTZsjaZePoZZ7jq1aq7isdVdGXKHGn+AYyXyLhhqL7Gjx9nwoJWH8bmwOhp02fYt7kV9Hwn4UEcqZgfPxJyuNzEFxVeYBQjiLjQH7jyyitMQxBFH8bh7G7NLfHtrYBRxEicALdy5Qq3MOhZsF/DhEL2O00gJkLMRbnisIjWoMEVrm69unbsJEMakKzcFTfmGbt07mz3PONkeY51ZJIxP+uLsHJCYdKEFxjFDCJEhiRz58yx1mXEyJGuQ4eOaVu8fRHYnJg5a6Z7+qmn4mfMSggA7tn+XqZMGesBUJ70AvCLjoKYjSuttO7Rlbj++utd8xYt4oInEfdNneq6dMkSFtQNqxGc/crS594KLzCKGSQU1M0F2POcMeP+fV5ghFtsTCGiW7B40SJjfpidsTxXDO+yT6N69eo25GCfCWN9Vi4kGBAaDF/QrGRfxzPPPGOW2hEoxIMf/EqH4aKLali8qoOZ999vuhb4Z2csm8kwDUg8ezO8wChmUA/jlVWrzGYBZvsgWtR5WTbbVxEWFpjt796tqzE75YUgoGw4uYszXLCAnSnjsrqCdihq1I888ojtAVFdEC8rHn379bPeCsKifft2JqD4jklVehaZnDi2p8ILjGIKlHmqV7vQ1JtZJlu0aLEJjr2dIJNBwoJeAaYMR4wYHi8DWnvmDTh5TlbVBcoqPDRJhMJNLE96LPfee6+bPXu22SYB9DjQa6hdp7br3atXPOw6deqakGFD175QN15gFEOI8BoGPYxFQZcb3HffNFuq29eGJWJqBOgtnTraCV3knzJiX8ZdgQDh7BdA2VBuicKB/wpH0H+uYRAuwwyAmjXHA7ApTH5xxIE/NnDNnTdvN72HvR37VlO1hwFNRYgXYsU+BtjX5jDIO/oHLVs0N2HB8IPWvlmzZu755583YYGg4BllI6HAVU7/w0j0J2gOg3kJFL5mzJjhpk6daismvNNQh5Pn5i9YENci3VfgBUYxhLq1VS6oYgwCNry5wSbp9iXQisO4nYKeBSfWSyBgJ5NWn5Pl0HqEkcXoYebnP4IEgYI/5hu48l9MzlXf4fSc+QkJojZt2pjKNjodpAegeYmtCRCOc2+HFxjFGBz6fMghWXYq//qXv5jxWAAjidD3VpBHBOewoUPd/KDbr54VQxBOsSfv+NHKR2JZwOg8Q5DwLf4QAlwlePge6Hsc93Lyh+C46KKLTHuUIyF4xs5QDirCnGJi3Hsz/BxGMUeD+vWDrvdzdr84aOXq1q1n9+kAM4jw9zRIWDz77DOucaNG1ivgGZaphgwZYv95r14FyCmfKL+xkYtVDxif1RSGGqykMMyQoCA8CQwQDpd74ic+ziFt0KCBCW+eoacxZcrU3b7dm+EFRjEErSMEDAGyR6F7t2523737bXYYM6ekffftt7ZqcNDBB9tSH5a60C6kFQ0TLmEBiH1PAczH5qu6derYxCNph0kfeughe0/ZpGJw5ns4+Z4TvVh65bDrMFCsorxuvvlmK096EgorkfEVLkDg0EOZP3++a9q0qaWB8mWvD5a4ud+Tyjk38AKjGAGCg1ghRPDRRx+Z8diePXrYM4gVApa/MHEjKDh5GzN/WKk+99w/u+OPO86W+wDEDjGHmaE4o1/fvm7kyBGWLwzHYCAGJlfvIxE8V96wNsWEqMBcB5OTCAaWTDX3AGB0lk/RAgXJwgYSHJQ94dxyyy02GcpzzA88//wLVtbhOtkb4QVGMUGY0BiCLH1hqXvqqSfNoArP1ZqlAv5whIVjlYVVBIYxZ599tvnJieGKE5gfOPecP1kPCqCohSalBKXKSVcQLj/sWGIXg52+VatWdZWCcsCGJoaIPvnkE5tAHTt2rPU+AKbsxowZY+FTNuFwQThspeHzzz+3YQ02KxDGQ4cNc127dtsjyjcv8AKjiBEmRo7cnx50pZcte8lm9HlHawZBAvyh6sxsPcMQWl92YaKjgNFXxun4gWD5VgzADsx6l9QzbUWOaQTheIsLlCZWRe6fMcOeYVWb09kFpTkx7ephcOXQY6xN1a79iwGZRDCBiTVtVp5QJefoQA5y5vtkwwrSJlCu1MusWTNdmzY3239O21++YoUZId6b4QVGEUEECJHD7P369nFPP/20CQoEBMIAomR7e4MrGriaNWpaK8lEHd1nhicIA4iVSUB0FZixf+utt+ygHMJicxUgTMI65NBDA6HR0XXr1t3mO4pja8jhPtWCIRVzGKSZoQV7QtINqSRswoKQ/CV+xzPKi/wjjFCMQ7cCA7033HCDvaNsU4E4suLhiMszzKwi302bNt01bdYs29feib2371SMIaLGLZg/31WpcoF77LHHrLcAKlSoYIpJK1eutNOqBg8abMt6mF/j/FX2LEDwdLEhdmb+aSXpfaAmPXnyZOvWY84eVWb8g51Ba4r5uDrBM7aAS+AUB6gXtWjRQjuPhTKqW7euDSfUU5JASAYJBPkhPO4RvPoWhxDiP4IDAQwod+10zSl8IeznV7/6tevRs0c8fXPmzkn7/Z4OLzAKGRAUhAtBsyehRYvmtsEMQNwoCWEqnln+c845J06gELicnoVd4jsYA+Hx1JNP2eoCcwC8p7Vdv26dq3/5ZfHt8/gvasBwtNIvLn3R0kNZMKRAKMKQEgRck0F50FW9isRv9J/4EBKAHhs7WkFO4Qu8V7i4WhfXsklVypYNg2xg25vhBUYhQsQKobZp3crdc89oYwyenX/+eW7p0qVu0qRJ1lOAeSBCETBXtZT6LweSvYPREEysGrADk253iRIlTJgwdm/b9mY3bty98e+KCuST9DPBu2nTRks3xmywL0GZiflTpVPv5C/8X1cccZF/TgGj98YzVl84q4N70pEOCgtgZ4OhjZ4tXfqCPSfdeyO8wChEQFDMNdzcprUNFxgrw9D0KhirXxiM3fkPw/AO/xIyOIWheyHxHd+I0XAIH/43b97cLVu2zM65wB/CiiVbBBcg3qIATAykYEWamdhlaEaaYOK8MiDfEw/lS3hTpkyxE8l4XqNGDZsk1bt04BvKj7QhfFSeuJUrVsT97I3wAqOQALEy+YhF8MWLFxtTgP79+xvxYpgWghWTi+AkAPgeAsUPAoCwcNzzXP4TvwOaxONbLEs/veRpV79BfdsXAcEzNGJVIhxvYUJM+v77f7e8kI4Lsg8JBmLG3CJcNgxxnn32WTds2DArU3Q8Bg8ebO9IR5R4wunhOzRHmYymfLHyTbh5SW9xhhcYhQARIwfVYBEcJuUZeyIGDBhgTAKR8RxC4x0I3/M9jIQfBAC9Axz3PE/2HVfd8z3fEtehhxzqFsxf4K688kqLl3fdu3dzq195xfwXNoifNLJapPSydR3of26g7wiDfFJOWNWiR4eOB2XHEJDJT/xmEpf8A4QOSnM8w3Dz1q1b85Tu4gwvMAoYMCjEs3z5MttIBZFCvLfddpvr2bOn9RJ4Hyaw8H/db978TxvG0BqyNIpSUuPGjc1wDJOa6GLgD6iFC4cH+A9z8p6Jvrlz55opO6BdoSxnFgVYqfjk408sjTA2p74p70p/JlDZcaUXRpgsObN0yrAHDB8+3CaD6RkIUeMKp415DIQGIB9bso3uqPz3Jng9jAIGRPPVl18GhNnANkJBuDAp2oZq3XGJENOjUYj68saN77gdO3bfEyHQ00D1meEN+yMUXrJwAWlCkNHjYK8GJuZo3Xl2c9u2buzYey1+0lrQEGN/9dVX7uqrr3Kvrl5tSmlMSCI0VEa5AWEjDBDSLDNj1BcNUDA0EN69gqGYhImYPxOQNkD6OGkMZTCWuB+YM8e0a/OS9uKKvSs3xRAQ4ewHZpsZfAgXfQmWTCEk3nGFsHFhiJGYJOUkb4QFKxx01dHJkJFbNAzppaCkRc8Dg7V8pzBzChcm4TvG33fffbf9xz0Y9GJefnml3YshChKkBfwcMPYP2XooPJOJf72PinC+cZQ5PYobb7wxLiwGDR5kwkJCUXWB/0zAN4TBd9qLgoD67rusfGQa3p4ALzAKGJ9/vt2NHDnSiAtiwp4D3Vdac4hVRJXIGCJgGKdr165mYxLV8RdffNFWOtDV4Iq1a4YpMm1PXPghbOLLKVyuMBPpoHXU0iDaolOnTLEhSmG0jmI4ftwrvYo7E6ZTvnCERRjsF6GHxrZ00Lt3b9e/X3/LNwgLbMUdFeG06VueETfINLw9AV5gFDDY0fh10N0G9AgaNmwYZ4wwgSdCzzn2/5577nG33nqraT3Sy+B7hAFXdDb69evn2rVrZ/7pNaDuLGIOE7WAv3DchIMgU2uLYNqQ3Ron+z4q+BZH+DAoLjE84iMNrBKxVV/ffPvtt9k+ooFvlC/KhrzQ67qh4Q1xYcFWdtnTUN71HS430Lf0BAHDvAMP3HuPGvACowABEc2bO9eIF0JiSzTzDRIYqYhU72Ao/CMIJCR4J+bmOYyIVqeM0WLcBT/ECUMkA+/FLIChDasHgDDvn3m/3et9KhCOhAJphCHDeSSdpBen8HQuCOeLsH9kzZpX3Tc7d9p7wvjyyy/NX1TwHenAkW/mfpgUXrlipb1v3769LaUSbzidOJUhyKm8cgJ5ozcmAUev7eBA+O2t8AKjACDiww4krRzESe+AuYcowgKIcLniF0IMMxzgnmcA/QLdS1AQVyooLPzimDDlW54/GaSdydpEKFwxnfIjocD3pFWMxBLjO++8415eudJWc4YPv9sOAMKSVr26ddy555zrTjrxBHdJvXq2igH4jklKpQuXDvJHvAiLho0amgEd5hYYsrF8SrrYg8MzLUvLqezC5ZsKig//1DGao4C9PceWK2f3UcPak+BXSQoAMBMEyD6RhxY86H69369t2MAqBq0ZhAvySlAQLHHBpMxd9O3b18LXCoDiShcPTC8GZ7zPTle+Yfclp66lA3thPvr4YzP48/HHH9ny6LbtARNt227LtDAUcwkSpFFAeQ0aNCiev3SQ4AKXX36ZW7LkGcsTG+9YwgYSKGHwDUuhbHTDdgZCMEp8AL/UMxPaTEIz/8Pu4jc2vGnP81q/xRFeYOQz1OpwoDKEy/Igm5MwAoP2YlQGCENhJgPvsBjFCgmEjyYnqyoyf5/IIInAD1C6Jk6caPMlEDzCg+P/8IMwYejw4YcfuC0fbrF9H//4x/vu06AHsStgFJgFhz5IOpAm5YdlSPaNMBfz9dc7TV8FoK7N5C1DBpVXKgYMlxG9LYRlJmBimbki8sn3qaAyQ2AgkOfNm+duuukmi7927Tpu4aJFcSG8t8ELjHwGjAez0QW/7rprbaMZS6Gc3wkhirBTEX8i9A1MADND1MSB7gICCeZlAxW7WyH6U045JU6wYUbKCfhRy4qwYbMaY32ETqVKlU0w0OWGeckffnFinGSg679/0D0/gGvgyhx5pOlV4CpUqOjKHXusK1+hgq3ukE78YIvzqiuvMBN6zKmwvR9hQl7Ibyqoh4Fjbwe9GiFVa8878sQcB5OilDFDlHRQfFxRnhs/fryV3+A77zTLW1HKfU+EFxj5DDEek52tW7eyexSjUOqJOkRIhJifSdRkZ4byDlN87EnBDD5pEJNEJVwJuk8//cRdeullpkJNuMSdCjA6ggVtxyOPPCoQDGVM1bpC+QqmLl0uuMeSVRQgCK+84gq3YsVyE64TJkxwLVu2jJcbyCkv4XxSThJm6fKOP/JIfMQRpbz0DeWFID3vvPPsSEX+v7pmrTvjjDOyfe598AIjnyHmZnJv4IAB1lphHl97RtS9zgQKE8bp2LGDtfQIhW++2eU2bNgQV3Vm/IziFqsDfAPhpyN+AAOIUfgOC93od8AAxEPcCKKyRx/tji5b1pUte3RwX9aVKV3GlSpdyszSlS17lCsd/M8JhAuUnsR0SdAOGzbUzk+lrBgS0d1XPkhHFIYuSKisAOlY/MRid83V19h/tsi/vKpo9uMUFrzAKCB07nyrKUAhMNDsxIIWTADRZ0pQYhKuYrz//vfnYNjwo5nQxyQfk5zc00o+8ugj7ooGV8TH/1HiI2z8k15adeZFSGvnzl1s4tMsex1yiDvgwANzHOMTBoxPfIkuHZRHVNVr1LjIdFeIk3kMWvBwrykZ9L3ucwO+D4eTDAqbK+XDifFYL6PsxowdGwxtOtj7vRV+WbUAADFp8g+iQtlKSEWMOUHfcIVpcL/5zW9t/I/NCPQnpk+fbgwG4Y4bN870AhAWEjBRQLpxGvZwz/CCiVTiOfyII+LzMDAwDiFIHDwjfQgs4iWNmQhH/BEGqup1ate2/0ziYtAXEBbvcckQjof73Dh9mxOUR/JLehYuWmj7gygDtHfr12+Q7XPvhRcYBQCY9l/Zmn8QWG73RQhiEjFM2EGsOLaqyyL4+nXr3caNGy0+/EQBfuUQGErrji+yTvhiOKSweIdQyI1gSAWF0a37bfF7rIQtX77c4gDhvBcWFB9poqwBk9mDBg6yZ7xr0aKlDdsKM11FAS8wCgAQkQge/DcWvZUHIrowoeqaGDYMCyBkVkcAvRu0KPV9VMivrsSDUJBACMdbkGDSkCMIEVTkjyVPehsSGoWVDkF5p1yUJs41QSjzn15Yy1atzG8m5b0nwguMAgBMxpIigIC+3ZXZvggxBFcIkq6/QHhhhgYiYjQcAcMC7Z6Un3RQuJbeYDijOPLaO8oNiLtHj562ykLe0ABFaAD+40iP0liQUJngqAfK9rnnn3MjRoywZ6SFtGJSkHsJtb0VXmAUACBmrFoBiEg6AdxHIXL54YogQABBrAx16EkQDs6GPtmWo1DBZvKNuGnxIGDuM2F04sI/rTnh81/5yCScvIJ8k4dBgwYbA5J/5miYm+GefJM+0hSlPHMLwla+KXfKGRN87dq2syVg6oQl81atW5vfvV1YAC8w8hka4x5b7lgjNlx4X0QUxpNfwAoIggBixcEwMDKO//QkCB8DvwgmvmNXbIWKWQZ0M4lPzIhaN6B3QT5AlHDyCzAe6WnUuLExoxTVWAmaM2eOTbxK+JIupT8/EQ6bcqRsMDKExS5U4Imfc2LGT5hg/guzfIoSflk1n0GrA3Gx0ar5Tc2M0GvVqmV6DTAj70AqAhOxAqxEofHIPgfG9hz8izo1ftifgYIVRm1p+QA9C+xkoJMBocN8UYhZfjkrlFaT8JjEW/riS9bah9NUWCBOJhdbtmgRlN8SSx8Tsuybadu2rfkJ5zE/0kgYgHAIm//UGVqoGOFh3oLnJUqWdI88/IirfMEF5n9fgRcY+QyICSHBhqRrrrnabQ9afSYjV61aFXl/h7rbAJVlbGoIPJfqMi2vwPPTTz/dVhVQESeMdPEIpEmCjuMOGtRv4P7z839Mpf2V1a9a2EpPUYDNbVddfZVbt3atpZH09ujRw3ah8p+0k768CA6+AXxH2RGmyhn7INQDPTjeod06fcb9tjKl+t5X4Ick+QwRD0KC/RAQIIQmIy5qtVJBxM61U6dOpiVKL4UNWhjUIQ4YBf0O9BbYNs+sPftVEBbEwbfEky6uMKMAzupAWBDHn887z5gwXRgFCRj0iCCfDz74kKtRo6YxMmnCgO+ll15q6aUsSC/vyLsQJd0qI5UXvUDuERaofQ8Y0N80X6lDwj4sEPr3z5y1TwoL4HsYBQC11mh7cho7YNMYG8OiDkuSAaJlxyjddAgVy07lypU3O6GCiD/xPhXUG2E5luMJEW78f/Sxx2xfSdRwCgpKH/Y5et7e045q4D/AYHCHDh1Mk1bLyvgHUdNM/nBifuqPE+OpL1TviQvhgALb+PET3AVVqhR5mRQVvMAoAIjAX3xxqWt4ww22THnqqadadx/m5n2qlgliBBAk92o1JWgSofdiIiEKQRO+0vvKK6+4atWq2XfMhfzlr3+La30WNcSgpHXq1Cmub58+tprDc8qSJdjLLrvMNW3W1J335/Oyv8oMn3221c2fv8AOmqIsFCfli2nFIXcNjStnRSnbvRFeYBQgILTKlc63CUTuOVW9devWcQYF6QhPxMk17ADPw05+o0LhcCU9mPnDShjpu+22Hu7OIUPsfXFBOH8cq4jQQCjznJ4bq0b0OBAebNGvWbOmCWqeadjC99QFjjkgemxs6WdSmuEN5g3JPw6/hDVw0GDbCEcYfJdK2O/t8AKjgDFr5kzXvn07u0d1mxUPrECBxB5BYULMJwZgUhajNTynV7HqldU2PxJm0uKCcJowTDR58iQ7kR4BAKPD2LznHr86aIhy5x1DL2yGsiIkwUBdoP4OKA/OWr322uvcrZ0726oUwG9R1llxgBcYBQxsM/z53HNMVwJiw4weW9Bh1DDxFSZTiuHEUIzZMTHHpCktNTsuR40ebekrzHRlgkRBRs/ohReed8uXLXPvv/++vQ8jkdF5H/ZDWIcddpgNyS4KBCc9Crbte+wOLzAKECLqRx991DW5sbF1mZl9Z8s2VqE0OSrCLQzmVJq4IhxID2rO2NBEgDDH8tTTS0zfQ36LM0gzkECg14CFsHVBj4OjEhDUWCQLL0ELzNMcf/wJNpmJPgWrUPQCqROwrw8/ksELjAKEBAGCAYFBKwgxQpRYtKZFk9AoTISFBUpeKGrRHYdBMDHH3og9jVkoR4RGuCdBnujh/fjjv4L7f9vkM/lCg/X3v/+d+91vA/f73//PxK5Wsoq7sCwKeIFRwNC4lw1Ul116qfviix3GsKztc7iyhIUIvaCIVMILkCaEAV13hAVXntWqVdsM2Ba2AMtPkA/ymqmwU0+F8veCImfsPrDzyHcgCCBGehVYZIKYIUiW7jB8I+IWwQKehRk8r1CcQD0HuumcAC9hwXLhxEmT9mhhASjvZMJCZRp2YfAdzguL1PACoxAgocGyJUuVdJ8hTOxVYn8TfQIJDRzvcIlEnSnCjIGgIGwEAspIaCrS6+E9KuvTZ8ywJcS8xllcoTINO4/M4QVGIQGhATN269bd3XFHL2NgJkFZFkTt+52N75jQwB9jaPxC1FwzZWJ9o+8Jj7BxTMBiYRzdEN6x23XCxEmuevWL4oLMwyMneIFRBBg4aJD1NGBkWn02qtWsUdM2mf3ww/cmSHgOA4Ow4MCBZFc5Mb0mApncxAx+t+7dbPcrxoJ5h43OOXPnWc8HAbanD0c8Ch5+0rMIwdkl7I3glDT1QOrUqe2aNGkauF+OKAwLhVQI9w50z8rAjGC4gTFdehU8RziwE3XChIm2wSwsZDw8UsELjCICPQiEBPMJXbp0tq3b/DcEvFvp/ErWG2COg6MWMwV2G2bNmmUqz7LhwJCEnkWLli1NeaxMmax9LfF4PTzSwAuMIoSYGDN7EydOcOPHjXeff749Pr9By89RAmefdbarU6+OHZRT7thypjfA8AFGxy9DG841ZcUDbU2ExAcfbHY//viTCQQcPQj2VbAvgk1a4fg9PKLCC4wiRng4wDzD5EmT3JIlT8eXO4HmNDQkQfEIpS+es8LCvgjNd6i3EP7PsIPeSuvWbeKHEPlhiEdu4AVGMUGYgbEd+eLSpbY3YsWKFXZkANB7CZIwJCgIB8fBQ7Vq1zajM3Xr1rUdm3rvBYVHbuEFRjECzMwwQasV7H+g18HeiLVr1rr33nvXeh7bt38e9Cy+s6EMQxaGKJx7ih1Phh3Ygzi2XDnTqxDocfhVEI+8wguMYgjNOyQyOAKF+QqEinoS9BboXTAXwRAlEQgK3vlehUd+wAuMYg4EB8yeCcPn5hsPjyjw62nFHPQeMmX83Hzj4REFXmB4eHhEhhcYHh4ekeEFhoeHR0Q49/8T2iuYO59jUgAAAABJRU5ErkJggg=="
    }
   },
   "cell_type": "markdown",
   "id": "6792ba02-5bd4-4915-8cc2-3e29a10e0090",
   "metadata": {},
   "source": [
    "![image.png](attachment:8c50e003-511d-4aaf-859a-1d099d30cd88.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f16b6ce-7964-4727-9566-2087deb60bd2",
   "metadata": {},
   "source": [
    "https://en.wikipedia.org/wiki/Laplacian_matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3a85a62-c001-4a26-9d92-769117cc38b6",
   "metadata": {},
   "source": [
    "#### 先创建邻接矩阵A。邻接矩阵表示的是网络连接关系，有一的位置代表两个节点间有连接"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "6612bcc0-e79d-4f53-8965-2c34831c756d",
   "metadata": {},
   "outputs": [],
   "source": [
    "A = np.array([[0, 1, 0, 0, 1, 0],\n",
    "              [1, 0, 1, 0, 1, 0],\n",
    "              [0, 1, 0, 1, 0, 0],\n",
    "              [0, 0, 1, 0, 1, 1],\n",
    "              [1, 1, 0, 1, 0, 0],\n",
    "              [0, 0, 0, 1, 0, 0]\n",
    "             ], dtype=float)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "388a6eac-fa01-46c4-a4ca-c0502f8b45b3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 1., 0., 0., 1., 0.],\n",
       "       [1., 0., 1., 0., 1., 0.],\n",
       "       [0., 1., 0., 1., 0., 0.],\n",
       "       [0., 0., 1., 0., 1., 1.],\n",
       "       [1., 1., 0., 1., 0., 0.],\n",
       "       [0., 0., 0., 1., 0., 0.]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "afd25cfe-c82a-4368-9f51-8f0fdc02fe77",
   "metadata": {},
   "source": [
    "#### D矩阵代表的是每个节点的度，即每个节点的边数量，非零值只出现在对角线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "efeffe1a-a3d4-4840-901c-24eaf251d184",
   "metadata": {},
   "outputs": [],
   "source": [
    "D = np.diag(np.sum(A, axis=1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "63bb5653-afe2-41e5-adb1-0c721bdde99f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2., 0., 0., 0., 0., 0.],\n",
       "       [0., 3., 0., 0., 0., 0.],\n",
       "       [0., 0., 2., 0., 0., 0.],\n",
       "       [0., 0., 0., 3., 0., 0.],\n",
       "       [0., 0., 0., 0., 3., 0.],\n",
       "       [0., 0., 0., 0., 0., 1.]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "D"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dd36f140-8612-4848-9a66-6f5ae13ac8df",
   "metadata": {},
   "source": [
    "#### D_inv代表的是D矩阵逆，也就是D矩阵对角线值的倒数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "658e6989-3482-4e38-b2b3-c133abfaa37c",
   "metadata": {},
   "outputs": [],
   "source": [
    "D_inv = np.diag(np.reciprocal(np.sum(A, axis=1)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5e261a32-c87c-4221-b404-3c5d387d0dd8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.5       , 0.        , 0.        , 0.        , 0.        ,\n",
       "        0.        ],\n",
       "       [0.        , 0.33333333, 0.        , 0.        , 0.        ,\n",
       "        0.        ],\n",
       "       [0.        , 0.        , 0.5       , 0.        , 0.        ,\n",
       "        0.        ],\n",
       "       [0.        , 0.        , 0.        , 0.33333333, 0.        ,\n",
       "        0.        ],\n",
       "       [0.        , 0.        , 0.        , 0.        , 0.33333333,\n",
       "        0.        ],\n",
       "       [0.        , 0.        , 0.        , 0.        , 0.        ,\n",
       "        1.        ]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "D_inv"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f759229-ba94-49a0-b29d-749cbab434b4",
   "metadata": {},
   "source": [
    "#### 创建随机游走转移矩阵P和高次项矩阵$P^2$、$P^3 \\dots$。P和高次项矩阵的对角线代表的是随机游走回到自身节点的概率，如K=1代表的就是走一步回到自身节点的概率，$P^K$对角线表示的是随机游走K步后回到自身节点的概率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "16d8dbf7-a1ff-4700-a8f2-f6263639c0b8",
   "metadata": {},
   "outputs": [],
   "source": [
    "K = 4 # 随机游走最大步数\n",
    "P = np.matmul(D_inv, A) # K=1的随机游走转移矩阵\n",
    "RW_ii = np.diagonal(P) # P的对角线代表每个节点回到自身节点的概率\n",
    "\n",
    "# P的高次项转移矩阵，代表的是走了k步后回到自身节点的概率\n",
    "for k in range(2, K+1):\n",
    "    P = np.matmul(P, P) # 连乘P矩阵\n",
    "    RW_ii = np.vstack((RW_ii, np.diagonal(P))) # 取出连乘P矩阵的对角线，追加到RW_ii矩阵"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b65b588-243e-4e48-8b48-928adeb055dc",
   "metadata": {},
   "source": [
    "#### pe_mat的每一行对应的是该节点的位置编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4200c862-f70e-41be-b961-8a40d85a6d0b",
   "metadata": {},
   "outputs": [],
   "source": [
    "pe_mat = RW_ii.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "feae2ae0-f69b-4090-adc1-cf42f9c0ce48",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.        , 0.33333333, 0.19444444, 0.14703361],\n",
       "       [0.        , 0.44444444, 0.32098765, 0.25830666],\n",
       "       [0.        , 0.33333333, 0.26851852, 0.21310585],\n",
       "       [0.        , 0.61111111, 0.4691358 , 0.34964182],\n",
       "       [0.        , 0.38888889, 0.30864198, 0.26318397],\n",
       "       [0.        , 0.33333333, 0.2037037 , 0.13197302]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pe_mat"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c9261d45-dfd9-40f4-9892-7d09b057f5f6",
   "metadata": {},
   "source": [
    "#### 可以用比较自然的字典数据结构来储存每个节点的位置编码，字典的key对应的是节点名称，value就是位置编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e97c9558-4cc1-4757-b7ff-9af9058cd356",
   "metadata": {},
   "outputs": [],
   "source": [
    "pe = dict(zip(range(1, RW_ii.shape[1]+1), [RW_ii[:, node] for node in range(RW_ii.shape[1])]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "dca8df55-c51f-46d2-ace5-644e387208bb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{1: array([0.        , 0.33333333, 0.19444444, 0.14703361]),\n",
       " 2: array([0.        , 0.44444444, 0.32098765, 0.25830666]),\n",
       " 3: array([0.        , 0.33333333, 0.26851852, 0.21310585]),\n",
       " 4: array([0.        , 0.61111111, 0.4691358 , 0.34964182]),\n",
       " 5: array([0.        , 0.38888889, 0.30864198, 0.26318397]),\n",
       " 6: array([0.        , 0.33333333, 0.2037037 , 0.13197302])}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pe"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93a4a91c-0c57-4dd7-80c3-fd6997a9e471",
   "metadata": {},
   "source": [
    "#### 可视化节点位置编码两两间的相似度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "c1d82fa6-cd5a-4466-8124-561b199d89c2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x20b3ce308d0>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "mat_dist = distance_matrix(pe_mat.T, pe_mat.T)\n",
    "plt.matshow(mat_dist)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "main_kernel",
   "language": "python",
   "name": "main_kernel"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
